from requests.exceptions import RequestException
import requests
import re,time,json

def getPage(url):
    '''爬取指定url页面信息'''
    try:
        #定义请求头信息
        headers = {
            'User-Agent':'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1)'
        }
        # 执行爬取
        res = requests.get(url,headers=headers)
        #判断响应状态,并响应爬取内容
        if res.status_code == 200:
            return res.text
        else:
            return None
    except RequestException:
        return None

def parsePage(html):
    '''解析爬取网页中的内容，并返回字段结果'''
    #定义解析正则表达式
    pat = '<h2>.*?<a.*?class="strongbox".*?rel="nofollow" >(.*?)</a>.*?</h2>.*?<p class="room strongbox">(.*?)</p>.*?<div class="money">.*?<b class="strongbox">(.*?)</b>.*?</div>'
    items = re.findall(pat,html,re.S)
    #遍历封装数据并返回
    for item in items:
        yield {
            'title':item[0],
            'hometype':item[1],
            'money':item[2],
            #'title':item[2],
            #'actor':item[3].strip()[3:],
            #'time':item[4].strip()[5:],
            #'score':item[5]+item[6],
        }

def writeFile(content):
    '''执行文件追加写操作'''
    print(content)
    #print(content)
    with open("./58.txt",'a',encoding='utf-8') as f:
        f.write(json.dumps(content,ensure_ascii=False) + "\n")
        f.close()
        #json.dumps 序列化时对中文默认使用的ascii编码.想输出真正的中文需要指定ensure_ascii=False

def main(page):
    ''' 主程序函数，负责调度执行爬虫处理 '''
    url = "http://bj.58.com/dashanzi/chuzu/pn"+page+"/?ClickID=1"
    #print(url)
    html = getPage(url)
    #判断是否爬取到数据，并调用解析函数
    if html:
        for item in parsePage(html):
            writeFile(item)

# 判断当前执行是否为主程序运行，并遍历调用主函数爬取数据
if __name__ == '__main__':
    while True:
        page = input("请输入爬取的页数,按Q退出。")
        if page == 'q':
            break
        else:
            main(page)
            time.sleep(1)
